# -*- coding: utf_8 -*-
# @Create   : 2021/9/18 11:29
# @Author   : yh
# @Remark   : 定时任务model层
import time
from datetime import datetime
from typing import Union

from mxsoftpy import Model
from pydantic import constr, validator


class TimedTaskModel(Model):
    """
    定时任务模型，此处没有按照PEP.8规范使用下划线，是因为字段为C++方面定义
    """
    name: constr(min_length=1, max_length=50)  # 任务名称
    runtype: int                               # 程序类型 1：DLL类型、2：EXE类型
    dll: str = ''                              # dll文件名称（程序类型选用DLL时）
    functionName: str = ''                     # 函数名称（程序类型选用DLL时）
    RunExeName: str = ''                       # EXE文件名称（程序类型选用EXE时）
    RunPath: str = ''                          # EXE文件路径（程序类型选用EXE时）
    parameter: str                             # EXE运行参数（程序类型选用EXE时）
    type: int                                  # 任务重复类型 1：仅执行一次、2：一天、3：一周、4：一月、5：自定义时间
    intervaltime: int = 0                      # 重复间隔时间（当重复类型为5时）
    intervaltimeunit: int = 1                  # 间隔时间的单位 1：分钟、2：小时、3：天、4：周、5：月
    starttime: Union[int, str]          # 开始时间 （需要使用字符串日期，C++不识别时间戳）
    status: int = 1                            # 数据状态 0：停用、1：启用 （C++读取使用）
    state: int = 1                             # 状态 0：删除、1：在用
    purpose: str = ''                          # 执行目的（类似desc）

    @validator('starttime')
    def check_start_time(cls, value):
        """
        校验时间字符串是否合法，并转换为C++需要的时间格式（支持时间戳和时间字符串）
        """
        if isinstance(value, str):
            try:
                datetime.strptime(value, "%Y-%m-%d %H:%M")
            except ValueError:
                raise AssertionError('时间格式不符合，需要的格式：%%Y-%%m-%%d %%H:%%M，您的时间：%s' % value)
            return value

        return time.strftime("%Y-%m-%d %H:%M", time.localtime(value))
